package com.superf.taobao.service;

import com.superf.taobao.entity.Book;
import com.superf.taobao.util.BookUtil;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.LinkedList;

public class ShowDetailServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        String id = req.getParameter("id");//获取书的编号
        Book book = BookUtil.findBookById(id);
        out.write("浏览图书信息:"+book.toString());

        //拼接的id
        String linkid=linkID(id,req);
        //把拼接的id放到Cookie中传递给浏览
        Cookie cookie = new Cookie("histroyrecord",linkid);
        cookie.setPath("/");
        cookie.setMaxAge(Integer.MAX_VALUE);
        resp.addCookie(cookie);//把cookie存到客户端

        //告知浏览器2秒后发请求给showAllBooks
        resp.addHeader("refresh", "2;url="+req.getContextPath()+"/showAllBooks");
    }

    //拼接逻辑的方法
    private String linkID(String id, HttpServletRequest req) {
        //1.加入第一次访问访问图书列表，也就是说没有Cookie,那么直接返回id
        Cookie[] cookies = req.getCookies();
        if(cookies==null){
            return id;
        }

        //2.//存在的cookie,但没有名字histroyrecord的cookie
        Cookie historyCookie = null;
        for(Cookie cookie:cookies){
            if(cookie.getName().equals("histroyrecord")){
                historyCookie =cookie;
                break;
            }
        }

        if(historyCookie == null){
            return id;
        }

        //3.找到对应的cookie
        String value =historyCookie.getValue();//可能就是1，或者1-2-3
        /*拼接的情况
         * 1.长度小于4，没有冲突的情况，直接放在头部，比如：1-2-3 ，访问4  ，结果：4-1-2-3
         * 2.长度小于4，有冲突的情况，先删除存在的编号，再把编号添加到头部, 比如: 1-2-3 访问2 结果:2-1-3
         * 3.长度等于4. 有冲突的情况，先删除存在的编号，再把编号添加到头部, 比如: 1-2-3-4 访问2 结果:2-1-3-4
         * 4.长度等于4，没有冲突的情况，删除最后一个，把编号放到头部，比如：1-2-3-4 访问5 结果： 5-1-2-3
         *
         */

        //把数组中转换成一个集合，再把集合放到LinkedList中
        LinkedList<String> list = new LinkedList<>(Arrays.asList(value.split("-")));
        if(list.size()<4){
            //代表冲突
            if(list.contains(id)){
                list.remove(id);//删除
            }
        }

        if(list.size()>=4){
            //代表冲突
            if(list.contains(id)){
                list.remove(id);//删除
            }else{
                list.removeLast();//删除最后一个
            }
        }

        //把编号放到头部
        list.addFirst(id);

        //拼接id字符串，比如 1-2-3-4
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<list.size();i++){
            if(i>0){
                sb.append("-");
            }
            sb.append(list.get(i));
        }
        return sb.toString();
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }


}
